/**
 * @author gyh
 * result作为vue-template-compile.js 解析出来的template层次的ast树
 * 返回格式化好的pageJson
 */
const forMatVueToDesignJson = (content) => {
	// 此处可以解析到AST树结构，方便解析生成pageJson的children
	let result = VueTemplateCompiler.compile(content);

	// 此处解析获取到的是页面的styles和script数据
	let vueParseModel = VueTemplateCompiler.parseComponent(content);

	// 解析出来export default的对象变量
	let { exportDefault, importStr } = forMatVueToDesignScriptJson(vueParseModel.script?.content || '')

	if (!result.ast) {
		throw new Error('当前解析未生成ast结构语法树, 请检测文件是否正常')
	}

	let lowCodePageJson = {
		children: [],
		pageMeta: {},
		methods: [],
		style: "",
		importStr: "",
		version: "1.0.0",
		viewModel: {},
		pageInputParam: [],
		events: {},
		quoteJs: [],
	};

	// 生成页面的children 已解析完成
	lowCodePageJson.children = forMatVueChildren(result)

	// 已解析完成
	lowCodePageJson.viewModel = forMatVueViewModel(exportDefault)

	// 已解析完成
	lowCodePageJson.pageMeta = forMatVuePageMeta(result)
	
	// 已解析完成
	lowCodePageJson.methods = forMatVueMethods(exportDefault, lowCodePageJson)

	// 已解析完成
	lowCodePageJson.style = forMatVueStyle(vueParseModel.styles)

	// 已解析完成
	lowCodePageJson.importStr = forMatVueImportStr(importStr)

	// 已解析完成
	lowCodePageJson.events = forMatVueEvents(exportDefault, lowCodePageJson)

	// 解析watch监听
	forMatVueWatch(exportDefault, lowCodePageJson)

	// someThingAndNothing 用于格式化解析后的数据，做一些业务操作
	finallyForMatPageJson(lowCodePageJson)


	return lowCodePageJson
}

/**
 * 解析导入项
 */
// const getImportName = (code) => {
// 	// 匹配单行注释，例如: // import { a } from "ccc";
// 	const singleLineCommentRegex = /\/\/.*$/gm;

// 	// 匹配多行注释，例如: /* import * from "xxxx"; */
// 	const multiLineCommentRegex = /\/\*[\s\S]*?\*\//g;

// 	// 去除所有注释
// 	let codeWithoutComments = code.replace(singleLineCommentRegex, '') // 去除单行注释
// 		.replace(multiLineCommentRegex, ''); // 去除多行注释

// 	// 匹配具名导入，包括带别名的导入，例如: import { a, b as bb } from "xxx";
// 	const namedImportRegex = /import\s*\{\s*([\s\S]+?)\s*\}\s*from\s*"([^"]+)";/g;

// 	// 匹配默认导入，例如: import vue from "vue";
// 	const defaultImportRegex = /import\s+([^'"\s]+)\s+from\s+"([^"]+)";/g;

// 	// 用于存储提取的变量名
// 	const variables = [];

// 	// 处理具名导入
// 	let match;
// 	while ((match = namedImportRegex.exec(codeWithoutComments)) !== null) {
// 		const imports = match[1].split(',').map(i => i.trim()); // 分割并去除空格
// 		imports.forEach(importItem => {
// 			const aliasMatch = importItem.match(/^([a-zA-Z_$][a-zA-Z0-9_$]*)\s+as\s+([a-zA-Z_$][a-zA-Z0-9_$]*)$/);
// 			if (aliasMatch) {
// 				// 如果有别名，使用别名
// 				variables.push(aliasMatch[2]);
// 			} else {
// 				// 否则，使用原始变量名
// 				variables.push(importItem);
// 			}
// 		});
// 	}

// 	// 处理默认导入
// 	while ((match = defaultImportRegex.exec(codeWithoutComments)) !== null) {
// 		variables.push(match[1].trim());
// 	}

// 	return variables
// }

/**
 * 解析导入项
 */
const getImportName = (code) => {
	// 匹配单行注释，例如: // import { a } from "ccc";
	const singleLineCommentRegex = /\/\/.*$/gm;

	// 匹配多行注释，例如: /* import * from "xxxx"; */
	const multiLineCommentRegex = /\/\*[\s\S]*?\*\//g;

	// 去除所有注释
	let codeWithoutComments = code
			.replace(singleLineCommentRegex, '') // 去除单行注释
			.replace(multiLineCommentRegex, ''); // 去除多行注释

	// 匹配具名导入，包括带别名的导入，例如: import { a, b as bb } from "xxx"; 或 import { a, b as bb } from 'xxx';
	const namedImportRegex = /import\s*\{\s*([\s\S]+?)\s*\}\s*from\s*['"]([^'"]+)['"];?/g;

	// 匹配默认导入，例如: import vue from "vue"; 或 import vue from 'vue';
	const defaultImportRegex = /import\s+([^'"\s]+)\s+from\s+['"]([^'"]+)['"];?/g;

	// 匹配命名空间导入，例如: import * as name from 'xxx'; 或 import * as name from "xxx";
	const namespaceImportRegex = /import\s*\*\s*as\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*from\s*['"]([^'"]+)['"];?/g;

	// 用于存储提取的变量名
	const variables = [];

	// 处理具名导入
	let match;
	while ((match = namedImportRegex.exec(codeWithoutComments)) !== null) {
			const imports = match[1].split(',').map(i => i.trim()); // 分割并去除空格
			imports.forEach(importItem => {
					const aliasMatch = importItem.match(/^([a-zA-Z_$][a-zA-Z0-9_$]*)(\s+as\s+([a-zA-Z_$][a-zA-Z0-9_$]*))?$/);
					if (aliasMatch) {
							// 如果有别名，使用别名
							if (aliasMatch[3]) {
									variables.push(aliasMatch[3]);
							} else {
									// 否则，使用原始变量名
									variables.push(aliasMatch[1]);
							}
					}
			});
	}

	// 处理默认导入
	while ((match = defaultImportRegex.exec(codeWithoutComments)) !== null) {
			variables.push(match[1].trim());
	}

	// 处理命名空间导入
	while ((match = namespaceImportRegex.exec(codeWithoutComments)) !== null) {
			variables.push(match[1].trim());
	}

	return variables;
};


/**
 * 解析script函数
 */
const forMatVueToDesignScriptJson = (data) => {

	// 由于返回的数据结构存在 export default, 目前没找到可以手动解析的方法，所以只能手动解析
	let splitScript = data.split('export default');

	// 意味着没有导入项
	if (splitScript.length == 1) { splitScript.unshift('') }

	// 动态参数列表解析splitScript[0]中的外部引入变量，生成args的动态形参
	let args = getImportName(splitScript[0]); // 假设有四个参数
	let argsStr = args.join(', '); // 'a, b, c, d'

	// 动态生成函数体，这里我们返回所有参数的和
	let body = `
		return ${splitScript[1]}
	`;

	// 创建函数
	let func = new Function(argsStr, body);

	// 调用函数
	
	return {
		importStr: splitScript[0],
		exportDefault: func(...args) || {}
	}

}